package com.algorithm.string;

import org.junit.Assert;
import org.junit.Test;

import java.util.Arrays;

/**
 * 将一个给定字符串 s 根据给定的行数 numRows ，以从上往下、从左到右进行 Z 字形排列。
 * 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时，排列如下：
 * P   A   H   N
 * A P L S I I G
 * Y   I   R
 * 之后，你的输出需要从左往右逐行读取，产生出一个新的字符串，比如："PAHNAPLSIIGYIR"。
 *
 * 输入：s = "PAYPALISHIRING", numRows = 4
 * 输出："PINALSIGYAHRPI"
 * 解释：
 * P     I    N
 * A   L S  I G
 * Y A   H R
 * P     I
 */
public class ZigConversion {
    /**
     * 0-> x: 0, y: 0
     * 1-> x: 1, y: 0
     * 2 -> x: 2, y: 0
     * 3 -> x: 1, y: 1
     * 4-> x: 0, y: 2
     * 5-> x: 1, y: 2
     * 6 -> x: 2, y: 2
     * 7 -> x: 1, y: 3
     * 8-> x: 0, y: 4
     * 9-> x: 1, y: 4
     * 10 -> x: 2, y: 4
     * 11 -> x: 1, y: 5
     * 12-> x: 0, y: 6
     * 13-> x: 1, y: 6
     */
    @Test
    public void test() {
        String converted = convert("PAYPALISHIRING", 3);
        Assert.assertEquals("PAHNAPLSIIGYIR", converted);
    }

    public String convert(String str, int numRows) {
        if (numRows <= 1) {
            return str;
        }

        char[] charArray = str.toCharArray();
        int length = charArray.length;

        StringBuilder[] arr = {new StringBuilder(), new StringBuilder(), new StringBuilder()};

        // 行索引变化
        boolean addFlag = true;
        int circle = 0;

        int y = 0;
        for (int i = 0; i < length; i++) {
            if (addFlag && circle < numRows -1) {
                System.out.println(i + "-> x: " + circle + ", y: " + y);

                arr[circle].append(charArray[i]);

                circle++;
                if (circle == numRows - 1) {
                    addFlag = false;
                }
            }
            else {
                System.out.println(i + " -> x: " +circle + ", y: " + y);
//                characters[circle][y] = charArray[i];

                arr[circle].append(charArray[i]);

                y++;
                circle--;
                if (circle == 0) {
                    addFlag = true;
                }
            }
        }


        return Arrays.stream(arr).map(StringBuilder::toString).reduce("", String::concat);
    }

}
